package Data;

import Model.ClienteBean;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.text.SimpleDateFormat;
import java.util.Vector;

public class ClienteDAO extends Conexao {

    public Vector listarClientes(String nome) throws SQLException {
        //Formatador de datas
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

        //Declaro a consulta
        String sql = "select * from cliente where inativo = 'F'";

        //Crio um vetor que vai contar as linhas da tabela
        Vector clientes = new Vector();

        //se tiver algum nome pra pesquisar modifico a consulta
        if (nome != null && !nome.isEmpty()) {
            sql += " and clientenome like '%" + nome + "%'";
        }

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Executo a consulta
        ResultSet rs = ps.executeQuery();

        //Percorre todas as linhas de resultado da query
        while (rs.next()) {
            Vector linha = new Vector();

            //Preenche a linha com as informações
            linha.add(rs.getInt(1));
            linha.add(rs.getString(2));
            linha.add(rs.getString(3));
            try {
                linha.add(sdf.format(rs.getDate(4)));
            } catch (Exception e) {
                linha.add("-");
            }
            try {
                linha.add(sdf.format(rs.getDate(5)));
            } catch (Exception e) {
                linha.add("-");
            }
            linha.add(rs.getString(6));
            linha.add(rs.getString(7));
            linha.add(rs.getString(8));

            clientes.add(linha);
        }

        //Fecho o PreparedStatment
        ps.close();

        //Retorno os clientes encontrados
        return clientes;
    }

    public ClienteBean getCliente(int id) throws SQLException {
        //Declaro a query
        String sql = "select * from cliente where clientecod = ?";

        //Declaro o objeto cliente de retorno caso ache algum
        ClienteBean cliente = null;

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Checo se o id é maior que zero
        if (id < 0) {
            return null;
        }

        //Coloco o parametro recebido pelo metodo na consulta
        ps.setInt(1, id);

        //Executo a consulta
        ResultSet rs = ps.executeQuery();

        //Checo se encontrou algum resultado
        if (rs.next()) {

            //Instancio o cliente
            cliente = new ClienteBean();

            //Preenche o cliente com as informações
            cliente.setCliente_cod(rs.getInt(1));
            cliente.setCliente_nome(rs.getString(2));
            cliente.setCpf(rs.getString(3));
            cliente.setData_associação(rs.getDate(4));
            cliente.setData_nascimento(rs.getDate(5));
            cliente.setTelefone(rs.getString(6));
            cliente.setEmail(rs.getString(7));
            cliente.setEnderenço(rs.getString(8));
        }

        //Fecho o PreparedStatment
        ps.close();

        //Retorno o cliente
        return cliente;

    }

    public ClienteBean getCliente(String nome) throws SQLException {
        //Validação do nome
        if (nome == null || nome.isEmpty()) {
            return null;
        }

        //Declaro a query
        String sql = "select * from cliente where inativo = 'F'";

        //Declaro o objeto cliente de retorno caso ache algum
        ClienteBean cliente = null;

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Executo a consulta
        ResultSet rs = ps.executeQuery();

        //Checo se encontrou algum resultado
        if (rs.next()) {

            //Instancio o cliente
            cliente = new ClienteBean();

            //Preenche o cliente com as informações
            cliente.setCliente_cod(rs.getInt(1));
            cliente.setCliente_nome(rs.getString(2));
            cliente.setCpf(rs.getString(3));
            cliente.setData_associação(rs.getDate(4));
            cliente.setData_nascimento(rs.getDate(5));
            cliente.setTelefone(rs.getString(6));
            cliente.setEmail(rs.getString(7));
            cliente.setEnderenço(rs.getString(8));
        }

        //Fecho o PreparedStatment
        ps.close();

        //Retorno o cliente
        return cliente;

    }

    public boolean atualizarCliente(ClienteBean cliente) throws SQLException {

        //Declaro a query
        String sql = "UPDATE CLIENTE "
                + " SET CLIENTENOME = ?, CLIENTECPF = ?, CLIENTEDATANASC = ?, CLIENTEFONE = ?, CLIENTEEMAIL = ?, CLIENTEENDERECO = ?"
                + " WHERE CLIENTECOD = ?";
        
        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Coloco os parametros na consulta
        ps.setObject(1, cliente.getCliente_nome());
        ps.setObject(2, cliente.getCpf());
        ps.setObject(3, cliente.getData_nascimento());
        ps.setObject(4, cliente.getTelefone());
        ps.setObject(5, cliente.getEmail());
        ps.setObject(6, cliente.getEnderenço());
        ps.setObject(7, cliente.getCliente_cod());

        //Executo a consulta
        int resultado = ps.executeUpdate();

        //Fecho o ps
        ps.close();

        //Verifico se atualizou algum registro
        if (resultado >= 1) {
            return true;
        } else {
            return false;
        }


    }

    public boolean cadastrarCliente(ClienteBean cliente) throws SQLException {
        //Declaro a query
        //String sql = "insert into CLIENTE values (?,?,GETDATE(),?,?,?,?,'F')";
        String sql = "{CALL CADASTRAR_CLIENTE(?,?,?,?,?,?,?)}";

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        CallableStatement ps = conn.prepareCall(sql);

        //Coloco os parametros na consulta
        ps.setObject(1, cliente.getCliente_nome());
        ps.setObject(2, cliente.getCpf());
        ps.setObject(3, cliente.getData_nascimento());
        ps.setObject(4, cliente.getTelefone());
        ps.setObject(5, cliente.getEmail());
        ps.setObject(6, cliente.getEnderenço());
        ps.setObject(7, null);

        //Registro os parametros de saida
        ps.registerOutParameter(7, Types.VARCHAR);
        
        //Executo a consulta
        ps.execute();
        
        //Pego o resultado na variavel de saida
        String resultado = ps.getString(7);
        
        //Fecho o ps
        ps.close();

        //Verifico se deu tudo certo
        if (resultado.equalsIgnoreCase("SUCESSO")) {
            return true;
        } else {
            throw new SQLException(resultado);
        }
    }

    public boolean deletarCliente(int id) throws SQLException {
        //Validação do id
        if (id < 0) {
            return false;
        }

        //Declaro a query
        String sql = "UPDATE CLIENTE SET INATIVO = 'T' WHERE CLIENTECOD = ?";

        //Pego uma conexao com o banco
        Connection conn = getConexao();

        //Preparo a consulta
        PreparedStatement ps = conn.prepareStatement(sql);

        //Coloco os parametros na consulta
        ps.setInt(1, id);

        //Executo a consulta
        int resultado = ps.executeUpdate();

        //Fecho o preparedStatment
        ps.close();

        //Verifico se atualizou algum registro
        if (resultado >= 1) {
            return true;
        } else {
            return false;
        }
    }

    public boolean deletarCliente(ClienteBean cliente) throws SQLException {

        //Validação do objeto cliente
        if (cliente != null && cliente.getCliente_cod() > 0) {

            //Chamo o metodo para deleção e retorno o resultado do metodo
            return deletarCliente(cliente.getCliente_cod());

        } else {

            //Objeto invalido ou com indice do cliente invalido
            return false;
        }

    }
}
